home *** CD-ROM | disk | FTP | other *** search
- #if 0
-
- AREA area_new(int x,int y,int wid,int ht);
- void area_delete(AREA area);
- void area_clear(AREA area);
- void area_hline(AREA area,int x1,int x2,int y);
- int area_getSect(AREA area,int x,int y,int *sx1,int *sx2);
- // (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
- void area_polygon(AREA area,POINT *points,int nPoint);
- void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!);
-
- #endif
-
- #define MODULE_AREA
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <winb.h>
- #include <te.h>
- #include <fntb.h>
- #include <gui.h>
- #include <egb.h>
- #include <wgb.h>
- #include <msdos.cf>
- #include "art.h"
- #include "guisub.h"
- #include "wgbmac.H"
- #include "alert.h"
- #include "subgrp.h"
-
- #include "imagewin.h"
- #include "imgwin.h"
- #include "desktop.h"
-
- #include "area.h"
-
- AREA area_new(int x,int y,int wid,int ht)
- {
- AREA area;
- if ((area = TL_calloc(1,sizeof(AREA_DATA))) == NULL)
- return NULL;
- if ((area->buf = TL_calloc(1,((wid+7)/8)*ht)) == NULL)
- { TL_free(area); return NULL; }
- area->x = x;
- area->y = y;
- area->wid = wid;
- area->ht = ht;
- memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
- return area;
- }
-
- void area_delete(AREA area)
- {
- TL_free(area->buf);
- TL_free(area);
- }
-
- void area_clear(AREA area)
- {
- memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
- }
-
- static char bitmask[] = {128,64,32,16,8,4,2,1};
-
- static BOOL area_chkbit(AREA area,int x,int y)
- {
- if (x < area->x || area->x + area->wid <= x ||
- y < area->y || area->y + area->ht <= y)
- return FALSE;
- char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + ((x-area->x)>>3);
- if (*p & bitmask[(x-area->x)&7])
- return TRUE;
- else
- return FALSE;
- }
-
- static void area_setbit(AREA area,int x,int y)
- {
- if (x < area->x || area->x + area->wid <= x ||
- y < area->y || area->y + area->ht <= y)
- return;
- char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + (x-area->x)/8;
- *p |= bitmask[(x-area->x)&7];
- }
-
- void area_hline(AREA area,int x1,int x2,int y)
- {
- for (int i=x1; i<=x2; i++)
- area_setbit(area,i,y);
- }
-
- int area_getSect(AREA area,int x,int y,int *sx1,int *sx2)
- // (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
- {
- while (x < area->x+area->wid && !area_chkbit(area,x,y))
- x++;
- if (x >= area->x + area->wid)
- return -1;
- *sx1 = x;
- while (x+1 < area->x + area->wid && area_chkbit(area,x+1,y))
- x++;
- *sx2 = x;
- return NOERR;
- }
-
- void area_polygon(AREA area,POINT *points,int nPoint)
- {
- void hline(int x1,int x2,int y)
- {
- area_hline(area,x1,x2,y);
- }
- do_polygon(points,nPoint,hline);
- }
-
- void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!)
- {
- int tx,sx1,sx2;
- tx = area->x;
- for (;;)
- {
- if (area_getSect(area,tx,y,&sx1,&sx2) != NOERR)
- break;
- hline(sx1,sx2,y);
- tx = sx2+1;
- }
- }
-